/*
 * Copyright 2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.codehaus.groovy.grails.plugins.acegi;

import javax.servlet.ServletException
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

import org.acegisecurity.util.PortResolver
import org.acegisecurity.util.PortResolverImpl

/**
 * 
 * @author Tsuyoshi Yamamoto
 * @since 2008/03/20 15:29:59
 */
class RedirectUtils {

  public static final void sendRedirect(
    HttpServletRequest request, HttpServletResponse response, String url)
    throws IOException {
    
    String commonRedirectUrl
    if (!url.startsWith("http://") && !url.startsWith("https://")) {
      def portResolver = new PortResolverImpl()

      boolean includePort = true;
      String scheme = request.getScheme();
      String serverName = request.getServerName();
      int serverPort = portResolver.getServerPort(request);
      String contextPath = request.getContextPath();
      boolean inHttp = "http".equals(scheme.toLowerCase());
      boolean inHttps = "https".equals(scheme.toLowerCase());
      if (inHttp && (serverPort == 80)) {
        includePort = false;
      }else if (inHttps && (serverPort == 443)) {
        includePort = false;
      }
      commonRedirectUrl = "${scheme}://${serverName}"+((includePort)?(":"+serverPort):"")+contextPath+url;
    }else{
      commonRedirectUrl=url
    }
    response.sendRedirect(response.encodeRedirectURL(commonRedirectUrl))
  }
}